Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>Object Constraint Language</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/Object_Constraint_Language"> <link href="./_mw_/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Object_Constraint_Language rootpage-Object_Constraint_Language skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Object Constraint Language</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p>Die <b>Object Constraint Language</b> (OCL) ist eine Sprache, mit der <a href="Softwarearchitekt" title="Softwarearchitekt">Softwarearchitekten</a> notwendige Randbedingungen bei der Modellierung von <a href="Computerprogramm" title="Computerprogramm">Computerprogrammen</a> formal festlegen können. Die OCL ist Bestandteil der weltweit etablierten Modellierungssprache <i><a href="Unified_Modeling_Language" title="Unified Modeling Language">Unified Modeling Language</a></i> (UML) und dient unter anderem der textuellen Spezifikation von <a href="Invariante_(Informatik)" title="Invariante (Informatik)">Invarianten</a> in <a href="Klassendiagramm" title="Klassendiagramm">Klassendiagrammen</a>, von Bedingungen in <a href="Sequenzdiagramm" title="Sequenzdiagramm">Sequenzdiagrammen</a> oder der Formulierung von Vor- und Nachbedingungen für Methoden. Die OCL-Syntax ist an die <a href="Programmiersprache" title="Programmiersprache">Programmiersprache</a> <a href="Smalltalk-80_(Programmiersprache)" class="mw-redirect" title="Smalltalk-80 (Programmiersprache)">Smalltalk</a> angelehnt. OCL ist seit der UML-Version&nbsp;1.1 Bestandteil der UML.
</p><p>Ein wesentliches Einsatzgebiet der OCL besteht auch in der Modelltransformation. Hier ist OCL ein zentraler Bestandteil vieler Transformationssprachen, wie <a href="MOF_QVT" title="MOF QVT">QVT</a> oder <a href="Atlas_Transformation_Language" title="Atlas Transformation Language">ATL</a>.
</p><p>Die aktuelle Version der OCL ist 2.4.<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup>
</p>

<div class="mw-heading mw-heading2"><h2 id="Constraints_in_der_OCL">Constraints in der OCL</h2></div>
<p>Es werden sieben Arten von Constraints (Zusicherungen) unterschieden:
</p>
<ul><li><i>Invariants</i> müssen zu jeder Zeit für eine Instanz oder Assoziation gelten.</li>
<li><i>Preconditions/Postconditions</i> müssen zu dem Zeitpunkt gelten, an dem die Ausführung der zugehörigen Operation beginnt/endet.</li>
<li><i>Initial &amp; derived Values</i> stellen Bedingungen für Ausgangs- und abgeleitete Werte dar.</li>
<li><i>Definition:</i> es können Attribute und Operationen definiert werden, die nicht im Modell enthalten sind.</li>
<li><i>Body Definition</i> von Operationen mit <code>isQuery = true</code>.</li>
<li><i>Guards</i> müssen gelten, wenn ein Zustandsübergang beginnt.</li></ul>
<p>Ein Constraint ist immer definiert im Rahmen eines <i>Kontexts</i>. Dies ist ein beliebiges Model Entity, wie beispielsweise eine Klasse, ein Typ, ein Interface oder eine Komponente. Man unterscheidet den Kontexttyp und die Kontextinstanz. Auf letztere beziehen sich die Angaben eines Constraints. Beispielsweise kann er festlegen, dass für eine Instanz der Klasse Banane der Wert des Attributs Krümmung nicht größer als X sein darf.
</p><p><i>Object</i> steht hier für eine Komponente eines beliebigen Systems, diese soll genauer spezifiziert, definiert oder beschrieben werden.
</p><p><i>Constraint</i> steht für eine Begrenzung oder Einschränkung; diese kann maximale oder minimale Werte annehmen, beispielsweise die maximale Anzahl gleichzeitiger Zugriffe auf eine Datenbank, oder die maximale Höhe eines Bauobjektes.
</p><p><i>Language</i> steht hier nicht für eine formale Computersprache, sondern vielmehr für eine auf jede Implementierung anwendbare weniger formale Sprache.
</p>
<div class="mw-heading mw-heading2"><h2 id="OCL_und_UML">OCL und UML</h2></div>
<p>Die OCL ist als Ergänzung zu UML konzipiert und soll die Modellierung von Software noch präziser gestalten. Während in UML Strukturen, Abläufe und Beziehungen zwischen Objekten modelliert werden, werden in OCL zusätzlich die Randbedingungen eines Modells spezifiziert. Dabei kann es sich beispielsweise um die Beschränkung eines Attributs auf einen Wertebereich handeln, oder um einzuhaltende Restriktionen zwischen Objekten. OCL-Ausdrücke sind widerspruchsfrei und können von Programmen verarbeitet werden. Sie tragen somit zur Code-Generierung bei, wobei sie jedoch nicht das Modell verändern, sondern überwachen.
</p><p>UML eignet sich besser für die Entwicklung eines Modells, weil Diagramme leichter zu verstehen sind als eine textuelle Repräsentation des Modells. OCL alleine ist ungeeignet für die Modellierung von Software.
</p>
<div class="mw-heading mw-heading2"><h2 id="Beispiel">Beispiel</h2></div>
<p>Das folgende UML-<a href="Klassendiagramm" title="Klassendiagramm">Klassendiagramm</a> verdeutlicht die OCL und lässt verschiedene Bedingungen in OCL formulieren:
<span class="mw-default-size" typeof="mw:File"></span>
</p>
<table class="wikitable">
<caption>
</caption>
<tbody><tr>
<th>Bedingungen
</th>
<th>OCL Constraints
</th></tr>
<tr>
<td>Das Alter einer Person ist nicht negativ.
</td>
<td><code><b>context</b> Person <b>inv</b>: self.alter &gt;=0</code>
</td></tr>
<tr>
<td>Eine Person ist jünger als ihre Eltern.
</td>
<td><code><b>context</b> Person <b>inv</b>: self.eltern-&gt;forAll(e|e.alter&gt;self.alter)</code>
</td></tr>
<tr>
<td>Nach einem Geburtstag ist eine Person um genau ein Jahr älter.
</td>
<td><code><b>context</b> Person::hatGeburtstag() <b>post</b>: self.alter=self.alter@pre+1</code>
</td></tr>
<tr>
<td>Eine Person hat höchstens zwei Eltern.
</td>
<td><code><b>context</b> Person <b>inv</b>: self.eltern-&gt;size()&lt;=2</code>
</td></tr>
<tr>
<td>Wenn jemand ein Kind bekommen hat, ist die Menge seiner Kinder nicht leer und die Anzahl seiner Kinder ist größer als vorher.
</td>
<td><code><b>context</b> Person::bekommtKind() <b>post</b>: self.kinder-&gt;notEmpty() and self.kinder-&gt;size() &gt; self.kinder@pre-&gt;size()</code>
</td></tr>
<tr>
<td>Nur eine erwachsene Person darf ein Auto besitzen.
</td>
<td><code><b>context</b> Person <b>inv</b>: self.alter&lt;18 <b>implies</b> self.autos-&gt;isEmpty()</code>
</td></tr>
<tr>
<td>Die Erstzulassung eines Autos liegt nicht vor dem Baujahr.
</td>
<td><code><b>context</b> Auto <b>inv</b>: self.erstzulassung&gt;=self.baujahr</code>
</td></tr>
<tr>
<td>Jede Person, die mindestens ein Auto besitzt, hat mindestens ein Auto, das jünger ist als sie selbst.
</td>
<td><code><b>context</b> Person <b>inv</b>: self.autos-&gt;notEmpty() <b>implies</b> self.autos-&gt;exists( a | <b>Calendar.YEAR</b> - a.baujahr &lt; self.alter)</code>
</td></tr>
<tr>
<td>Niemand kann von sich selbst ein Elternteil sein.
</td>
<td><code><b>context</b> Person <b>inv</b>: self.eltern-&gt;excludes(self)</code>
</td></tr>
<tr>
<td>Es gibt mindestens eine Person, die ein Auto besitzt. (Bzw. von allen Personen gibt es mindestens eine Person, die mindestens ein Auto besitzt.)
</td>
<td><code style="white-space: nowrap"><b>context</b> Person <b>inv</b>: Person.allInstances()-&gt;exists(p | p.autos-&gt;size() &gt; 0)</code>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Literatur">Literatur</h2></div>
<ul><li>Jos Warmer, Anneke Kleppe: <cite style="font-style:italic">Object Constraint Language 2.0</cite>. Erste Auflage. mitp-Verlag, Bonn 2004, ISBN 3-8266-1445-3.<span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&amp;rfr_id=info:sid/de.wikipedia.org:Object+Constraint+Language&amp;rft.au=Jos+Warmer%2C+Anneke+Kleppe&amp;rft.btitle=Object+Constraint+Language+2.0&amp;rft.date=2004&amp;rft.edition=Erste&amp;rft.genre=book&amp;rft.isbn=3826614453&amp;rft.place=Bonn&amp;rft.pub=mitp-Verlag" style="display:none">&nbsp;</span></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="http://www.omg.org/spec/OCL/">OCL-Referenz der OMG</a></li>
<li><a rel="nofollow" class="external text" href="http://www-st.inf.tu-dresden.de/ocl/">OCL Portal – The center for OCL related information</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Einzelnachweise">Einzelnachweise</h2></div>
<ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.omg.org/spec/OCL/">OMG Spezifikation</a></span>
</li>
</ol></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2022-11-18" href="https://de.wikipedia.org/wiki/?title=Object_Constraint_Language&amp;oldid=228074662">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>